package com.asm.service;

import com.asm.dto.PageResult;
import com.asm.entity.sys.Role;
import com.asm.repository.RoleRepository;
import com.asm.util.SnowflakeIdWorker;
import com.asm.vo.sys.RoleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 功能描述
 *
 * @author Tanzujie
 * @date 2019-07-10
 */
@Service
public class RoleService {
    @Resource
    private RoleRepository roleRepository;
    @Resource
    private SnowflakeIdWorker snowflakeIdWorker;

    /**
     * 获取角色列表
     *
     * @param page 分页
     * @return 角色列表
     */
    private List<RoleVo> getRoleVoList(Page<Role> page) {
        List<RoleVo> list = new ArrayList<>();
        for (Role role : page.getContent()) {
            RoleVo roleVo = new RoleVo();
            BeanUtils.copyProperties(role, roleVo);
            list.add(roleVo);
        }
        return list;
    }

    /**
     * 分页查询所有角色
     *
     * @param pageNumber 当前页码
     * @param pageSize   页面大小
     * @return 角色
     */
    public PageResult<RoleVo> findAllRoles(Integer pageNumber, Integer pageSize) {
        Page<Role> page = roleRepository.findAll(PageRequest.of(pageNumber, pageSize));
        return new PageResult<>(pageNumber, pageSize, page.getTotalPages(), getRoleVoList(page));
    }

    /**
     * 根据id查询角色
     *
     * @param id 角色编号
     * @return 角色
     */
    public RoleVo findRoleById(Long id) {
        Role role = roleRepository.findById(id).get();
        RoleVo roleVo = new RoleVo();
        BeanUtils.copyProperties(role, roleVo);
        return roleVo;
    }

    /**
     * 根据角色类型分页查询角色
     *
     * @param code       角色代码
     * @param pageNumber 当前页码
     * @param pageSize   页面大小
     * @return 角色
     */
    public PageResult<RoleVo> findRoleByCode(String code, Integer pageNumber, Integer pageSize) {
        Pageable page = PageRequest.of(pageNumber, pageSize);
        Page<Role> roles = roleRepository.findByCodeAndIsDel(code, false, page);
        return new PageResult<>(pageNumber, pageSize, roles.getTotalPages(), getRoleVoList(roles));
    }

    /**
     * 添加角色
     *
     * @param roleVo 角色对象
     * @return 角色编号
     */
    @Transactional(rollbackFor = Exception.class)
    public Long addRole(RoleVo roleVo) {
        Role role = new Role();
        BeanUtils.copyProperties(roleVo, role);
        role.setId(snowflakeIdWorker.nextId());
        role.setCreateAt(new Date());
        role.setCreateBy(1L);
        role.setUpdateAt(new Date());
        role.setUpdateBy(1L);
        roleRepository.save(role);
        return role.getId();
    }

    /**
     * 更新角色
     *
     * @param roleVo 角色对象
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateRole(RoleVo roleVo) {
        Role role = roleRepository.findById(roleVo.getId()).get();
        BeanUtils.copyProperties(roleVo, role);
        role.setUpdateBy(1L);
        role.setUpdateAt(new Date());
        roleRepository.save(role);
    }

    /**
     * 根据Id删除角色
     *
     * @param id 编号
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteRole(Long id) {
        Role role = roleRepository.findById(id).get();
        role.setIsDel(true);
        role.setUpdateBy(1L);
        role.setUpdateAt(new Date());
        roleRepository.save(role);
    }

}
